"""
药房录入小工具 - 主程序
用于自动化从Excel读取数据并模拟鼠标操作进行录入
"""

import pandas as pd
import pyautogui
import pyperclip
import time
from pathlib import Path

# 全局变量：当前锁定的行和所有加载的数据
_locked_row = None
_all_dfs = []  # 存储所有Excel文件的DataFrame


def load_excel(filenames=None):
    """
    加载当前目录下的Excel文件
    
    Args:
        filenames: Excel文件名列表，如果为None则自动加载所有.xlsx文件
    
    Returns:
        bool: 加载成功返回True，失败返回False
    """
    global _all_dfs
    try:
        if filenames is None:
            excel_files = list(Path('.').glob('*.xlsx'))
            if not excel_files:
                print("错误：未找到Excel文件")
                return False
        else:
            excel_files = [Path(f) for f in filenames]
        
        _all_dfs = []
        for file in excel_files:
            df = pd.read_excel(file)
            _all_dfs.append(df)
            print(f"成功加载：{file.name} (共{len(df)}行)")
        
        print(f"\n总共加载 {len(_all_dfs)} 个Excel文件")
        return True
    except Exception as e:
        print(f"加载Excel失败：{e}")
        return False


def lock_line(content):
    """
    根据内容在所有已加载的Excel文件中锁定某一整行
    
    Args:
        content: 要搜索的内容，会在所有文件的所有列中查找包含此内容的行
    
    Returns:
        bool: 找到并锁定返回True，未找到返回False
    """
    global _locked_row, _all_dfs
    
    if not _all_dfs:
        print("错误：请先加载Excel文件")
        return False
    
    try:
        # 在所有文件中搜索
        for df in _all_dfs:
            mask = df.astype(str).apply(lambda row: row.str.contains(str(content), na=False).any(), axis=1)
            matching_rows = df[mask]
            
            if len(matching_rows) > 0:
                _locked_row = matching_rows.iloc[0]
                print(f"已锁定行：{content}")
                return True
        
        print(f"未找到包含 '{content}' 的行")
        return False
    except Exception as e:
        print(f"锁定行失败：{e}")
        return False


def input_information(column_name, pos, clicks=1):
    """
    从锁定行读取指定列的内容，点击坐标并粘贴
    
    Args:
        column_name: 列名
        pos: 坐标元组 (x, y)
        clicks: 点击次数，默认1次
    
    Returns:
        bool: 操作成功返回True，失败返回False
    """
    global _locked_row
    
    if _locked_row is None:
        print("错误：请先使用 lock_line() 锁定行")
        return False
    
    try:
        if column_name not in _locked_row.index:
            print(f"错误：列名 '{column_name}' 不存在")
            return False
        
        # 获取内容并转换为字符串
        content = str(_locked_row[column_name])
        if content == 'nan':
            content = ''
        
        # 复制到剪贴板
        pyperclip.copy(content)
        
        # 点击指定位置
        pyautogui.click(pos[0], pos[1], clicks=clicks)
        time.sleep(0.1)
        
        # 粘贴
        pyautogui.hotkey('ctrl', 'a')
        pyautogui.hotkey('ctrl', 'v')
        print(f"已在 {pos} 输入 '{column_name}' 的内容：{content}")
        return True
    except Exception as e:
        print(f"输入信息失败：{e}")
        return False


def if_information(condition, pos, clicks=1, paste=False):
    """
    检查锁定行中某列的值是否满足条件，满足则点击坐标
    
    Args:
        condition: 条件字符串，格式为 "列名=值"，例如 "得分=100"
        pos: 坐标元组 (x, y)
        clicks: 点击次数，默认1次
        paste: 是否粘贴，默认False
    
    Returns:
        bool: 条件满足并操作成功返回True，条件不满足或失败返回False
    """
    global _locked_row
    
    if _locked_row is None:
        print("错误：请先使用 lock_line() 锁定行")
        return False
    
    try:
        # 解析条件
        if '=' not in condition:
            print("错误：条件格式错误，应为 '列名=值'")
            return False
        
        column_name, expected_value = condition.split('=', 1)
        column_name = column_name.strip()
        expected_value = expected_value.strip()
        
        if column_name not in _locked_row.index:
            print(f"错误：列名 '{column_name}' 不存在")
            return False
        
        # 获取实际值并比较
        actual_value = str(_locked_row[column_name]).strip()
        
        # 尝试数值比较
        try:
            if float(actual_value) == float(expected_value):
                condition_met = True
            else:
                condition_met = False
        except:
            # 字符串比较
            condition_met = (actual_value == expected_value)
        
        if not condition_met:
            print(f"条件不满足：{column_name}={actual_value} (期望={expected_value})")
            return False
        
        # 条件满足，执行点击
        pyautogui.click(pos[0], pos[1], clicks=clicks)
        print(f"条件满足，已点击 {pos}")
        
        # 如果需要粘贴
        if paste:
            time.sleep(0.1)
            pyautogui.hotkey('ctrl', 'v')
            print("已粘贴")
        
        return True
    except Exception as e:
        print(f"条件判断失败：{e}")
        return False


def reset_lock():
    """重置锁定的行"""
    global _locked_row
    _locked_row = None
    print("已重置锁定行")


def click(button, pos, clicks=1):
    """
    点击指定位置
    
    Args:
        button: 鼠标按钮，'left' 或 'right'
        pos: 坐标元组 (x, y)
        clicks: 点击次数，默认1次
    
    Returns:
        bool: 操作成功返回True，失败返回False
    """
    try:
        if button.lower() not in ['left', 'right']:
            print("错误：按钮类型必须是 'left' 或 'right'")
            return False
        
        pyautogui.click(pos[0], pos[1], clicks=clicks, button=button.lower())
        print(f"已{button}键点击 {pos} {clicks}次")
        return True
    except Exception as e:
        print(f"点击失败：{e}")
        return False


def exit_page():
    """
    关闭当前页面（按下 Ctrl+W）
    
    Returns:
        bool: 操作成功返回True，失败返回False
    """
    try:
        pyautogui.hotkey('ctrl', 'w')
        print("已关闭页面")
        return True
    except Exception as e:
        print(f"关闭页面失败：{e}")
        return False


if __name__ == "__main__":
    # 使用示例
    print("=== 药房录入小工具 ===\n")
    
    # 1. 加载Excel
    if not load_excel():
        exit(1)
    
    # 2. 锁定包含特定内容的行
    if lock_line("张三"):
        # 3. 输入信息到指定坐标
        time.sleep(2)  # 给用户准备时间
        input_information("得分", (650, 785), 1)
        
        # 4. 条件判断并点击
        if_information("得分=100", (700, 800), 1, False)
    
    print("\n操作完成")
